package org.jsshbroadcast;

import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.jsshbroadcast.ui.IUsuario;
import org.jsshbroadcast.jsbException.InterfaceException;
import org.jsshbroadcast.servidor.Servidor;
import org.jsshbroadcast.thread.ClasseThreadSSH;
import org.jsshbroadcast.thread.VerificaThread;
import org.jsshbroadcast.wol.ClasseThreadWOL;
import org.jsshbroadcast.xml.JDomXml;

/**
 *
 * @author Eduardo Folly
 */
public class Controladora {

    public void executar(IUsuario iu, String usuario, String senha, String comando, String servidores) throws Exception {

        if (usuario.equals("")) {
            throw new InterfaceException("É necessário que o usuário seja informado.");
        }

        if (senha.equals("")) {
            throw new InterfaceException("É necessário que a senha seja informada.");
        }

        if (servidores.equals("")) {
            throw new InterfaceException("É necessária que localização do arquivo XML dos servidores seja informada.");
        }

        if (comando.equals("")) {
            throw new InterfaceException("É necessário que o comando seja informado.");
        }

        ArrayList servs = new ArrayList();

        try {
            // Le arquivo xml com os servidores.
            JDomXml reader = new JDomXml(servidores);

            // Retorna lista de servidores.
            servs = reader.lerServidores();

        } catch (java.io.FileNotFoundException e) {
            throw new InterfaceException("O arquivo XML dos servidores não foi encontrado.");

        } catch (Exception e) {
            throw e;
        }

        // Habilita acompanhamento do progresso do processamento.
        iu.IniciaProgresso();

        // Quantidade de procedimentos.
        iu.setProgressoMaximo((servs.size() * 3) + 1);

        // Criação da lista de tarefas
        ArrayList tarefas = new ArrayList();

        for (int i = 0; i < servs.size(); i++) {
            Servidor serv = (Servidor) servs.get(i);

            // Verifica se deve usar o usuário informado na interface
            // caso não exista usuário informado dentro do XML.
            String usr = usuario;
            if (serv.getUsuario() != null) {
                usr = serv.getUsuario();
            }

            // Solicita uma senha diferente da informada na interface caso
            // a propriedade senha seja informada como true dentro do XML.
            String passwd = senha;
            if (serv.isSenha()) {
                passwd = iu.getSenha(usr + "@" + serv.getServidor() + ":" + serv.getPorta());
            }

            // Adiciona o servidor na lista de tarefas.
            Object task = new ClasseThreadSSH(iu, usr, passwd,
                    serv.getServidor(), serv.getPorta(), comando);

            tarefas.add((Runnable) task);
        }

        // Adiciona tarefa que irá encerrar o acompanhamento
        // do progresso de processamento.
        Object task = new VerificaThread(iu, iu.getProgressoMaximo());
        tarefas.add((Runnable) task);

        // Define o executor de tarefas
        ExecutorService threadExecutor = Executors.newCachedThreadPool();

        // Inicia tarefas.
        for (int x = 0; x < tarefas.size(); x++) {
            threadExecutor.execute((Runnable) tarefas.get(x));
        }

        // Incrementa progresso.
        iu.setIncrementaProgresso(1);
    }

    public void ligar(IUsuario iu, String servidores) throws Exception {
        System.out.println("ligar");

        if (servidores.equals("")) {
            throw new InterfaceException("É necessária que localização do arquivo XML dos servidores seja informada.");
        }

        ArrayList servs = new ArrayList();

        try {
            // Le arquivo xml com os servidores.
            JDomXml reader = new JDomXml(servidores);

            // Retorna lista de servidores.
            servs = reader.lerServidores();

        } catch (java.io.FileNotFoundException e) {
            throw new InterfaceException("O arquivo XML dos servidores não foi encontrado.");

        } catch (Exception e) {
            throw e;
        }

        // Habilita acompanhamento do progresso do processamento.
        iu.IniciaProgresso();

        // Quantidade de procedimentos.
        iu.setProgressoMaximo(servs.size() + 1);

        // Criação da lista de tarefas
        ArrayList tarefas = new ArrayList();

        for (int i = 0; i < servs.size(); i++) {
            Servidor serv = (Servidor) servs.get(i);

            // Adiciona o servidor na lista de tarefas.
            Object task = new ClasseThreadWOL(iu, serv.getServidor(), serv.getBroadcast(), serv.getMac());

            tarefas.add((Runnable) task);
        }

        // Adiciona tarefa que irá encerrar o acompanhamento
        // do progresso de processamento.
        Object task = new VerificaThread(iu, iu.getProgressoMaximo());
        tarefas.add((Runnable) task);

        // Define o executor de tarefas
        ExecutorService threadExecutor = Executors.newCachedThreadPool();

        // Inicia tarefas.
        for (int x = 0; x < tarefas.size(); x++) {
            threadExecutor.execute((Runnable) tarefas.get(x));
        }

        // Incrementa progresso.
        iu.setIncrementaProgresso(1);
    }
}